﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using CashShop.AccessDataLib1;

namespace CashShop.Bussiness1
{
    /// <summary>
    /// 客户端与要通过此类访问促销数据，定义门面Facade
    /// </summary>
    public class CashFacade1
    {
        //此方法是去调取CashAcceptType方法获取的xml文件的列表
        public string[] GetCashAcceptTypeList()
        {
            var cat = new CashAcceptType();

            //把获取到的ds转化为string[]()
            var ds = cat.GetCashAcceptType();

            //把ds转化为string[]（这个数组保存的是促销类别名称）
            var count = ds.Tables[0].DefaultView.Count;//通过获取到的ds长度来创建string[]
            string[] result = new string[count];

            //遍历ds，把需要的字段存放在string[]
            for(var i = 0; i < count; i++)
            {
                //表中的每一行的"name"字段
                result[i] = ds.Tables[0].DefaultView[i]["name"].ToString();
            }
            return result;
        }

        //
        /// <summary>
        /// 用于根据商品活动的不同，计算此商品的实际收费
        /// </summary>
        /// <param name="selectValue">用户选择的活动</param>
        /// <param name="startTotalPrice">原价</param>
        /// <returns></returns>
        public decimal GetTotalPrice(string selectValue, decimal startTotalPrice)
        {
            //获取配置文件中的活动类型
            var cat = new CashAcceptType();
            var ds = cat.GetCashAcceptType();

            var cs = new CashStrategy1();

            //按用户线则的活动名称，查出活动信息，主要是查出对应的Clas·para字段的内容
            var dataRow = ((DataRow[])ds.Tables[0].Select("name='" + selectValue + "'"))[0];

            //反射技术，根据已知的类名，读dll文件来创建对象
            //获取类名
            var classname = dataRow["class"].ToString();
            //获取参数
            object[] args = null;
            if (!string.IsNullOrEmpty(dataRow["para"].ToString()))
            {

                args = dataRow["para"].ToString().Split(',');
                //Split按逗号分隔取数组(这个位置获取新建的Class对应的参数)
            }

            //Assembly.Load 读取对应的dll文件
            //Createlnstance创建dll文件中对应类的对象
            cs.setBehavior((CashSuper)Assembly.Load("CashShop.Bussiness1")
                .CreateInstance("CashShop.Bussiness1." + classname, false, BindingFlags.Default, null, args, null, null));

            return cs.GetResult(startTotalPrice);
        }

    }
}
